package com.niu.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.niu.pojo.MyResult;
import com.niu.utils.MyJwtUtils;
import com.niu.utils.MyThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @Author 鹅鹅鹅
 * @Version 1.0.0
 * @Date 2025/7/18 16:40
 * @Description 自定义登录拦截器
 */
// @Component
public class MyLoginInterceptor implements HandlerInterceptor {

    // @Autowired
    private MyJwtUtils myJwtUtils;

    // 若定义的路径需要被拦截时, 访问该路径会执行该方法进行拦截操作, 若返回 true 则放行, 返回 false 不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
         * 进入到该方法都是被拦截的, 对拦截的请求进行验证
         * 1. 获取token
         * 2. 进行验证
         * 3. 验证失败, 为前端返回错误信息, 且拒绝放行
         * 4. 验证通过, 存入到ThreadLocal 中, 并放行
         */
        // 1. 获取token
        String token = request.getHeader("token");
        // 2. 进行验证
        Map<String, Object> map = myJwtUtils.parseJWT(token);
        if (map == null){
            // 3. 验证失败, 为前端返回错误信息, 且拒绝放行
            // 定义错误的统一响应信息
            MyResult<Object> error = MyResult.error("NO_LOGIN");
            // 转换json 格式
            String jsonString = JSONObject.toJSONString(error);
            // 对前端进行返回
            response.getWriter().println(jsonString);
            return false;
        }
        // 4. 验证通过, 存入到ThreadLocal 中, 并放行
        MyThreadLocalUtils.setValue(map);
        return true;
    }
}
